#include <iostream>
#include <vector>
#include <cstdlib>
#include <signal.h>
#include <math.h>

using namespace std;

typedef vector<int> vint;

typedef vector<vint> vvint;

typedef struct _jugada {
	int puntaje_propio;
	int i;
	int j;
	int d;
} jugada;

typedef jugada(*calc)(int);

#define forn(i,n) for(int i=0; i < (int)(n); ++i)

vvint tbl;
int n;
int yo;

/* Función para mostrar el tablero en stderr */
void board_show() {
	forn(i,n) { forn(j,n) cerr << ".#X"[tbl[i][j]+1]; cerr << endl; }
}

void aplica_movida(int i, int j, int d, int k) {
	tbl[i][j] = k;
	tbl[i+d][j+1-d] = k;
}

void lee_movida(int k) {
	int i,j,d;
	cin >> i >> j >> d; i--; j--;
	/* No es necesario checkear que la jugada sea válida, estamos seguros */
	aplica_movida(i,j,d,k);
}

int hay_movida() {
	forn(i,n) forn(j,n-1) if (tbl[i][j] == -1 && tbl[i][j+1] == -1) return true;
	forn(i,n-1) forn(j,n) if (tbl[i][j] == -1 && tbl[i+1][j] == -1) return true;
	return false;
}

/* Cuando se reciba un SIGTERM se ejecutará esta función. No es necesario
 * hacer nada acá, pero si alguno lo necesita puede hacer alguna tarea acá,
 * como guardar estadísticas del juego, etc. */
void terminar(int) {
	cerr << "Uy!, se acabó el partido!" << endl;
	exit(0);
}

int ValorIsla(vvint &tbl, int n, int i, int j, int c) {
	int res = 0;
	
	if((i>-1)
		&& (j>-1)
		&& (i<n)
		&& (j<n)
		&& (tbl[i][j] == c)) {
		tbl[i][j] = -1;
		res = 1;
		res = res + ValorIsla(tbl,n,i+1,j,c);
		res = res + ValorIsla(tbl,n,i,j+1,c);
		res = res + ValorIsla(tbl,n,i-1,j,c);
		res = res + ValorIsla(tbl,n,i,j-1,c);
	}
	
	return res;
}

int calcular(vvint tablero) {
	int puntaje_propio = 0;
	int puntaje_contrincante = 0;
	int res = 0;
	
	forn(i,n) forn(j,n) {
		puntaje_propio = puntaje_propio + pow(ValorIsla(tablero,n,i,j,yo),2);
		puntaje_contrincante = puntaje_contrincante + pow(ValorIsla(tablero,n,i,j,1-yo),2);
	}
		
	res = (puntaje_propio - puntaje_contrincante);
	
	return res;
}

jugada armar_jugadas(vvint jugadas, int n, int k) {
	jugada res;
	jugada actual;
	int modif;
	int puntaje = n*n;
	bool jugue = false;
	
	res.puntaje_propio = 0;
	res.i = -1;
	res.j = -1;
	res.d = -1;
	
	if (yo == k) { //juego yo
		modif  = 1;
	} else { //juega el otro
		modif = -1;
	}
	
	puntaje  = puntaje * modif*(-1);
	for (int i =0; i < n;i++) {
		for (int j =0; j < n;j++) {
			if ((j<n-1) && jugadas[i][j] == -1 && jugadas[i][j+1] == -1) {
				jugadas[i][j] = k;
				jugadas[i][j+1] = k;
				jugue = true;
				actual = armar_jugadas( jugadas, n, 1-k);
				if(actual.puntaje_propio*modif > puntaje*modif) {
					puntaje = actual.puntaje_propio;
					res.i = i;
					res.j = j;
					res.d = 0;
				}
				jugadas[i][j] = -1;
				jugadas[i][j+1] = -1;
			}
			
			if ((i<n-1) && jugadas[i][j] == -1 && jugadas[i+1][j] == -1) {
				jugadas[i][j] = k;
				jugadas[i+1][j] = k;
				jugue = true;
				actual = armar_jugadas( jugadas, n, 1-k);
				if(actual.puntaje_propio*modif > puntaje*modif) {
				puntaje = actual.puntaje_propio;
					res.i = i;
					res.j = j;
					res.d = 1;
				}
				jugadas[i][j] = -1;
				jugadas[i+1][j] = -1;
			}
		}
	}
	
	if(!jugue) {
		res.puntaje_propio = calcular(jugadas);
	} else {
		res.puntaje_propio = puntaje;
	}
	return res;
}

jugada calcMinmaxPoda(int k) {
	jugada res = armar_jugadas(tbl,n,k);
	
	return res;
}

jugada calcMinmax(int k) {
	jugada res = armar_jugadas(tbl,n,k);
	
	return res;
}

void juega_movida(int k, calc cF) {
	jugada res = cF(k);
	aplica_movida(res.i,res.j,res.d,k);
	cout << res.i+1 << " " << res.j+1 << " " << res.d << endl;
}

#define JUGADOR_MINMAX_SIN_PODA 0
#define JUGADOR_MINMAX_CON_PODA 1
calc calcs[] = {calcMinmax, calcMinmaxPoda};
const char* names[] = {"MINMAX_SIN_PODA", "MINMAX_CON_PODA"};

int main(int argc, char* argv[]) {
	if (argc > 1) {
		if (argc == 2 && string(argv[1]) ==  "-v") {
			cerr << names[JUGADOR] << endl;
			return 0;
		} else {
			cerr << "Usage: " << argv[0] << " [-v]" << endl;
			//return 1;
		}
	}
	
	signal(SIGTERM, terminar);
	int c;
	cin >> n >> c;
	tbl = vvint(n, vint(n, -1));
	yo = c;
	
	/* Si c==1, arrancamos leyendo una jugada del otro */
	if (n>1 && c) lee_movida(!c);
	
	while (hay_movida()) {
		juega_movida(c,calcs[JUGADOR]);
		// Si no hay movida para hacer se cuelga leyendo, pero el judge nos mata el proceso con SIGTERM
		lee_movida(!c);
	}
	
	return 0;
}
